"""
1.创建模板 将HTML文件放在template文件夹中，使用jinja2占位符
2.渲染模板 使用rander_template函数在视图函数中渲染模板
3.模板继承 创建基础模板，允许其他模板继承和扩张。
4.控制结构 使用条件语句和循环在模板中控制逻辑
5.过滤器 使用过滤器格式化变量
6.宏和模板包括 创建和使用宏以及模板包含，提高模板的复用性
7.安全性 jiaji2模板对模板变量进行自动转义以防止xss攻击
8.模板上下文 将数据传递给模板，并在模板中使用这些数据
"""

#1基本概念
#模板是包含占位符的HTML文件
#flask使用jinja2模板引擎来渲染这些模板 将python数据插入到html中，从而生成最终网页

#2.创建模板
#模板文件通常放在template文件夹中
#flask会自动从这个文件夹中查找模板内容
#创建/template/index.html文件

from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
    return render_template('index.html',title='Welcome Page',name='John Doe')


#3.模板继承
#在template中定义一个base.html,再定义一个sub.html作为子模版，实现模板继承以及扩展，避免重复html代码

#4.控制结构
#jinja2提供了多种控制结构，用于模板中实现条件逻辑和循环
#实例见templates/struct.html

#5.过滤器
#过滤器用于在模板中格式化和处理变量数据

#6.宏和模板包括
#宏是可重用的模板片段，模板包括允许你在一个模板中插入另一个模板内容
#创建宏 参看templates/macros.html

#7.安全性
#自动转义，Jinjia2默认会对模板中的变量进行自动转义，防止xss攻击
#<p{{user_inpu}}></p> 中userinput的内容会被自动转义，防止恶意脚本的注入

#8.模板上下文
#视图函数中传递变量成为模板的上下文，这些变量可以在模板中直接使用
@app.route('/profile/<username>')
def profile(username):
    user={'name':username,'age':25}
    return render_template('profile.html',user=user)

@app.route('/base')
def base():
    return render_template('base.html')

@app.route('/sub')
def sub():
    tems = [
        {'title': 'Item 1', 'description': '这是第一个项目的描述'},
        {'title': 'Item 2', 'description': '这是第二个项目的描述'},
        {'title': 'Item 3', 'description': '这是第三个项目的描述'}
    ]
    return render_template('sub.html',items=tems)

@app.route('/filter')
def filter():
    name='name'
    price=134.4556
    return render_template('filter.html',name=name,price=price)

if __name__=='__main__':
    app.run(debug=True)